/**
 *********************************************************
 ** <h1>SFMLex - Simple and Fast Multimedia Library Extensions.</h1>
 ** SFMLex Copyright (C) 2008 Neil Johnson (neil@emailus.me.uk)
 **
 ** SFML - Simple and Fast Multimedia Library
 ** Copyright (C) 2007-2008 Laurent Gomila (laurent.gom@gmail.com)
 **
 ** This software is provided 'as-is', without any express or implied warranty.
 ** In no event will the authors be held liable for any damages arising from the use of this software.
 **
 ** Permission is granted to anyone to use this software for any purpose,
 ** including commercial applications, and to alter it and redistribute it freely,
 ** subject to the following restrictions:
 **
 ** 1. The origin of this software must not be misrepresented;
 **    you must not claim that you wrote the original software.
 **    If you use this software in a product, an acknowledgment
 **    in the product documentation would be appreciated but is not required.
 **
 ** 2. Altered source versions must be plainly marked as such,
 **    and must not be misrepresented as being the original software.
 **
 ** 3. This notice may not be removed or altered from any source distribution.
 **
 ************************************************************
 */
#include "sm.h"

namespace sfx
{
   const char* c_AppStateMachine::m_LogName = "AppSM";
   const char* c_AppState::m_LogName = "AppSt";
   

   void c_AppStateMachine::addState( c_AppState* State )
   {
      std::string& StateName = State->getName();

      printf( "(%s:%p): "
         "addSection( %s mapped to %p )"
         "\n",
         m_LogName, (void*)this,
         StateName.c_str(), (void*)State
         );

      State->setAppStateMachineManager( this );
      
      if( m_States.empty() )
      {
         m_CurrentStateName = StateName;
      }

      m_States.insert( make_pair( StateName, State ) );
   }
   
   void c_AppStateMachine::Run( void )
   {
      m_NextStateName.clear();
      
      c_AppState* State;
      State = m_States[ m_CurrentStateName ];

      printf( "(%s:%p): "
              "Run - Initial section = %p"
              "\n",
              m_LogName, (void*)this,
              (void*)State
              );
      State->Enter();

      for(;;)
      {
         m_NextStateName = m_CurrentStateName;

         State->Run();

         if( m_NextStateName == "EXIT" )
         {
            State->Exit();
            break;
         }
         else if( m_NextStateName != m_CurrentStateName )
         {
            State->Exit();

            State = m_States[ m_NextStateName ];

            State->Enter();
         }

      }

   }
   

}
